package com.aviator.executor;

import com.googlecode.aviator.AviatorEvaluator;
import org.springframework.util.StringUtils;

/**
 * @Author: Jiangxx
 * @Date: 2021/12/30
 * @Description: 使用Java类方法作为自定义函数
 */
public class AviatorExecutor05 {

    public static void main(String[] args) throws IllegalAccessException, NoSuchMethodException {
        /**
         * 导入静态方法：从 4.2.2 开始， aviator 还提供了一个更便捷地批量将某个类的静态方法导入为自定义函数的方式
         */
        AviatorEvaluator.addStaticFunctions("str", StringUtils.class);
        System.out.println(AviatorEvaluator.execute("str.isEmpty('')"));//true


        /**
         * 导入实例方法：从 4.2.3 版本开始， aviator 同样支持将 java 某个类的实例方法导入 aviator 求值器作为自定义函数。
         * 但是跟通常的 java 方法调用方式 instance.method(args) 的方式不一样的是，
         * aviator 要求将 instance 这个 this 指针作为第一个参数明确传入。
         */
        AviatorEvaluator.addInstanceFunctions("s", String.class);
        System.out.println(AviatorEvaluator.execute("s.indexOf('Hello','l')")); // 2

        /**
         * 调用可变参数的方法
         */
        AviatorEvaluator.addStaticFunctions("test",FunctionTest.class);
        System.out.println(AviatorEvaluator.execute("test.JOIN(seq.array(java.lang.String, 'hello','dennis'))"));

        /**
         * 批量导入方法和注解支持
         */
        AviatorEvaluator.importFunctions(StringUtils.class);
        System.out.println(AviatorEvaluator.execute("StringUtils.isEmpty('')"));//true
    }


}
